package com.example.demo.controller;

import com.example.demo.model.UserInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;


import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

@Slf4j
@Controller
@ResponseBody // 作用：表示的是返回一个非静态页面的数据
@RequestMapping("/user") // 类上面的 RequestMapping 可以省略
public class UserController {

    @Value("${img.path}")
    private String imgPath;

    @RequestMapping("/sayhi")
    public String  sayHi(){

        return "Hello,World!!!  " + imgPath;
    }


    @RequestMapping(method = RequestMethod.POST,value = "/sayhi2")
    public String sayHi2(){
        return "你好，世界";
    }

    @PostMapping("/sayhi3")
    public String sayHi3(){
        return "你好，世界3";
    }

    @GetMapping("/sayhi4")
    public String sayHi4(){
        return "你好，世界4";
    }

    // 获取单个参数
    @RequestMapping("/getuserbyid")
    public UserInfo getUserById(Integer id){ // 此参数一定要和前端传递的参数名保持一致，否则就获取不到参数值
        // 不查数据库，伪代码，返回用户对象
        UserInfo userInfo = new UserInfo();
//        userInfo.setId(id);
        userInfo.setId(id == null ? 0 : id);
        userInfo.setUsername("漳卅");
        userInfo.setAge(17);
        return userInfo;
    }


    // 获取多个参数
    //@RequestParam：重命名前后端的参数值
    //        注意事项：如果在参数中添加 @RequestParam 注解，那么前端一定要传递此参数，否则就会报错，
    //                  如果想要解决此问题，可以给 @RequestParam 里面添加 required = false 参数
    @RequestMapping("/login")
    public String login(@RequestParam(value = "name", required = false)String  username,
                        String password){
        return "用户名："+username+" | 密码："+password;
    }

    // 获取对象
    @RequestMapping("/reg")
    public String reg(UserInfo userInfo){
        return "用户信息：" + userInfo;
    }


    // 获取URL中参数@PathVariable
    @RequestMapping("/hero/{id}/{name}")
    public String getHeroInfo(@PathVariable Integer id, @PathVariable String name){
        return "ID："+id+" | Name："+name;
    }


    //  上传⽂件@RequestPart
    @RequestMapping("/upimg")
    public boolean upImg(Integer uid, @RequestPart("img") MultipartFile file)  {
        boolean result = false;
        // 1. 目录=img.path
        // 2. 图片名称（图片名不能重复） 【时间戳/UUID】
        // 3. 获取原上传图片的格式
        String fileName = file.getOriginalFilename(); // 得到原图片的名称 (xxx.png)
        fileName = fileName.substring(fileName.lastIndexOf(".")); // 得到图片后缀 (png)
        fileName = UUID.randomUUID().toString() + fileName;
        // 保存图片到本地目录
        try {
            file.transferTo(new File(imgPath + fileName));
            result = true;
        } catch (IOException e) {
            log.error("上传图片失败："+ e.getMessage());
        }

        return result;
    }

    // 1. 获取Cookie
    // Servlet 获取 Cookie 的方法
    @RequestMapping("/cookie")
    public void getCookie(HttpServletRequest request){
        // 得到全部的 Cookie
        Cookie[] cookies = request.getCookies();
        for(Cookie item : cookies){
            log.info("Name：" + item.getName() + " | Value：" + item.getValue());
        }
    }

    // 2. 使用 @CookieValue 注解实现 Cookie 的读取
    @RequestMapping("/cookie2")
    public String getCookie2(@CookieValue("bite") String cookie){
        return "Cookie Value：" + cookie;
    }

    // 获取 Header（请求头）里面的信息
    // 1 传统获取 heade
    @RequestMapping("/getua")
    public String getHead(HttpServletRequest request){
        return "header：" + request.getHeader("User-Agent");
    }

    // 获取 Header（请求头）里面的信息
    // 1 简洁获取 Header @RequestHeader
    @RequestMapping("/getua2")
    public String getHead2(@RequestHeader("User-Agent") String userAgent){
        return "header：" + userAgent;
    }

    // 设置 Session
    @RequestMapping("/setsess")
    public boolean setSession(HttpServletRequest request){
        boolean result = false;
        // 1. 得到 HttpSession
        HttpSession session = request.getSession(true); // 如果没有会话，那么创建一个会话
        // 2. 使用 setAtt 设置值
        session.setAttribute("userinfo","张三");
        result = true;
        return result;
    }

    // 获取 Session 方法1 （Servlet 模式）
    @RequestMapping("/getsess")
    public String  getSession(HttpServletRequest request){
        String  result = null;
       // 1. 得到 HTTPSession 对象
        HttpSession session = request.getSession(false); // false 如果有会话，使用会话，如果没有，那么不会新创建会话
       // 2. getAtt 得到 Session 信息
       if (session != null && session.getAttribute("userinfo") != null){
           result = (String) session.getAttribute("userinfo");
       }
        return result;
    }


    // 获取 Session 方法2 （@SessionAttribute 注解）
    // required = false ：通常情况下需要添加，如果不添加的话，那么当 session 中不存在此属性的时候程序运行会报错
    @RequestMapping("/getsess2")
    public String getSession2(@SessionAttribute(value = "userinfo", required = false) String userinfo){
        return "会话： " +userinfo;
    }
}
